package lpca.utils 
{
	/**
	 * ...
	 * @author D.Shakshin, E.Plotnikov
	 * Класс, описывающий координаты точки.
	 */
	public class Point
	{	
		public var x: int;
		public var y: int;
		
		public function Point(x: int, y: int)
		{
			this.x = x;
			this.y = y;
		}
		
		public function clone(): Point
		{
			return new Point(this.x, this.y);
		}
		
		public function isEqual(p2: Point): Boolean
		{
			return ((this.x == p2.x) && (this.y == p2.y)); 
		}
		
		public function next(direction: int): Point
		{
			if (this != null)
			{
				switch(direction)
				{
					case Maze.DIR_UP: 
						return new Point(this.x, this.y - 1);
					case Maze.DIR_LEFT: 
						return new Point(this.x - 1, this.y);
					case Maze.DIR_DOWN: 
						return new Point(this.x, this.y + 1);
					case Maze.DIR_RIGHT: 
						return new Point(this.x + 1, this.y);
					default: 
						return null; // недопустимое направление
				}
			}
			else 
			{
				return null;
			}
		}
		/**
		 * Происк точки point в векторе vector.
		 * @param	vector
		 * @param	point
		 * @return Boolean
		 */
		public static function searchPointInVector(vector: Vector.<Point>, point: Point): Boolean
		{
			if (vector == null)
				return false;
			var myFunction:Function = function(item:Point, index:int, vector:Vector.<Point>):Boolean {
				if (point.isEqual(item))
					return true;
				return false;				
			};
			return vector.some(myFunction);						
		}		
		
		/**
		 * Проверяет на вхождение каждого элемента из вектора v1 в вектор v2 и возвращает элементы, которые не входят.		 
		 * @param	v1: Vector.<Point>
		 * @param	v2: Vector.<Point>
		 * @return Vector.<Point>
		 */				
		public static function compareVector(v1: Vector.<Point>, v2: Vector.<Point>): Vector.<Point>
		{
			var returnVector: Vector.<Point> = new Vector.<Point>();
			for each(var iterator1: Point in v1)
				{					
					//если  точки  вектора v1 нету во втором векторе v2 и нету в векторе различий						
					if ( searchPointInVector(v2, iterator1)==false && searchPointInVector(returnVector, iterator1)==false)
							returnVector.push(iterator1);											
				}
			if (v2.length > v1.length)
				for each(var iterator2: Point in v2)
				{					
					//если  точки вектора v2 нету во втором векторе v1 и нету в векторе различий						
					if ( searchPointInVector(v1, iterator2)==false && searchPointInVector(returnVector, iterator2)==false)
							returnVector.push(iterator2);											
				}
			return returnVector;
		}
		
		/**
		 * Проверка 2-х точек на соседство
		 * @param	point1
		 * @param	point2
		 * @return Boolean
		 */
		public static function checkAdjacency(point1: Point, point2: Point): Boolean
		{
			return (point1.x == point2.x) || (point1.y == point2.y);
		}
	}	
}